package com.burst.reptile.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

import cn.hutool.core.util.NumberUtil;

/**
 * 数字工具
 * @author wujin
 *
 * @date: 2020-7-24 10:50:36
 */
public class NumberUtils {
   
    private static final Double MILLION = 10000.0;
    private static final Double BILLION = 100000000.0;
    private static final String MILLION_UNIT = "万";
    private static final String BILLION_UNIT = "亿";
    
    /**
     * 将数字转换成以万为单位或者以亿为单位，因为在前端数字太大显示有问题
     * @param amount
     * @return
     */
    public static String amountConversion(int amount){
        //最终返回的结果值
        String result = String.valueOf(amount);
        //四舍五入后的值
        double value = 0;
        //转换后的值
        double tempValue = 0;
        //余数
        double remainder = 0;
        //数量大于1万小于1亿
        if(amount >= MILLION && amount < BILLION){
            tempValue = amount / MILLION;
            remainder = amount % MILLION;
            //余数小于5000则不进行四舍五入
            if(remainder < (MILLION / 2)){
                value = formatNumber(tempValue, 1, false);
            }else{
                value = formatNumber(tempValue, 1, true);
            }
            //如果值刚好是10000万，则要变成1亿
            if(value == MILLION){
                result = zeroFill(value/MILLION) + BILLION_UNIT;
            }else{
                result = zeroFill(value) + MILLION_UNIT;
            }
        } else if(amount >= BILLION){ //数量大于1亿
            tempValue = amount / BILLION;
            remainder = amount % BILLION;
            //余数小于50000000则不进行四舍五入
            if(remainder < (BILLION / 2)){
                value = formatNumber(tempValue, 1, false);
            }else{
                value = formatNumber(tempValue, 1, true);
            }
            result = zeroFill(value) + BILLION_UNIT;
        }
        return result;
    }
    
    /**
     *  对数字进行四舍五入，保留2位小数
     * @param number
     * @param decimal
     * @param rounding
     * @return
     */
    public static Double formatNumber(double number, int decimal, boolean rounding){
        BigDecimal bigDecimal = new BigDecimal(number);
        if(rounding){
            return bigDecimal.setScale(decimal,RoundingMode.HALF_UP).doubleValue();
        }else{
            return bigDecimal.setScale(decimal,RoundingMode.DOWN).doubleValue();
        }
    }
    
    /**
     * 对四舍五入的数据进行补0显示，即显示.00
     * @param number
     * @return
     */
    public static String zeroFill(double number){
        String value = String.valueOf(number);
        if(value.indexOf(".") > 0){
        	String decimalValue = value.substring(value.indexOf(".") + 1);
            if(NumberUtil.parseInt(decimalValue) == 0){
                DecimalFormat decimalFormat = new DecimalFormat("###################.###########");
                value = decimalFormat.format(number);
            }
        }
        return value;
    }
    
    /**
     * 测试方法入口
     *
         * @author
     * @version 1.00.00
     *
     * @date 2018年1月18日
     * @param args
     */
    public static void main(String[] args) throws Exception{
        amountConversion(120);
        amountConversion(10000);
        amountConversion(1222188);
        amountConversion(100000000);
        amountConversion(129887783);
    }
    
    
}
